//
//  CycleSpeechReader.m
//  iiiii
//
//  Created by ddy on 2018/10/12.
//  Copyright © 2018年 ddy. All rights reserved.
//

#import "CycleSpeechReader.h"
#import <AVFoundation/AVFoundation.h>
@interface CycleSpeechReader()<AVSpeechSynthesizerDelegate>
{
    //将文字添加到语音, 就是用语音播放一段文字
    AVSpeechSynthesizer *_speechSynthesizer;
    //被播放的语音文字, 可以理解为一段需要播放的文字
    AVSpeechUtterance *_speechUtterance;
}
@end
@implementation CycleSpeechReader
///初始化
+ (instancetype)cycle_sharedSpeechReader {
    static CycleSpeechReader *reader = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        reader = [CycleSpeechReader new];
    });
    return reader;
}
- (instancetype)init
{
    self = [super init];
    if (self) {
        //初始化
        _speechSynthesizer = [AVSpeechSynthesizer new];
        _speechSynthesizer.delegate = self;
        _speechUtterance = [AVSpeechUtterance new];
        
    }
    return self;
}
///开始语音
- (void)cycle_speechReaderWithContent:(NSString *)content andLanguage:(NSString * _Nullable )language {
    if (_speechSynthesizer.speaking) {
        //即在阅读器还没读完就立马暂停
        [_speechSynthesizer stopSpeakingAtBoundary:AVSpeechBoundaryImmediate];
    } else {
        _speechUtterance = [AVSpeechUtterance speechUtteranceWithString:content];
        if (language == nil) {
            language = @"zh-CN";
        }
        _speechUtterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:language];
        //可以得到所有语言
        //[AVSpeechSynthesisVoice speechVoices];
        // 本段文字播放时的 语速, 应介于AVSpeechUtteranceMinimumSpeechRate 0 和 AVSpeechUtteranceMaximumSpeechRate 1 之间
        
        _speechUtterance.rate = 0.4;
        // 声音大小, 0.0 ~ 1.0 之间
        _speechUtterance.volume = 1.0;
         // 在播放特定语句时改变声音的声调, 一般取值介于0.5(底音调)~2.0(高音调)之间
        _speechUtterance.pitchMultiplier = 1;
        //启动语音阅读器
        [_speechSynthesizer speakUtterance:_speechUtterance];
        
        
    }
}

#pragma mark --- <AVSpeechSynthesizerDelegate>
/// 开始播放 语音单元
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didStartSpeechUtterance:(AVSpeechUtterance *)utterance {
    NSLog(@"开始播放的语音内容:%@ --- %f",utterance.speechString,utterance.pitchMultiplier);
}
/// 完成播放 语音单元
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance {
    NSLog(@"完成播放的语音内容:%@ --- %f",utterance.speechString,utterance.pitchMultiplier);
}
/// 暂停播放 语音单元
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didPauseSpeechUtterance:(AVSpeechUtterance *)utterance {
    NSLog(@"暂停播放的语音内容:%@ --- %f",utterance.speechString,utterance.pitchMultiplier);
}
/// 继续播放 语音单元
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didContinueSpeechUtterance:(AVSpeechUtterance *)utterance {
    NSLog(@"继续播放的语音内容:%@ --- %f",utterance.speechString,utterance.pitchMultiplier);
}
/// 取消播放 语音单元
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didCancelSpeechUtterance:(AVSpeechUtterance *)utterance {
    NSLog(@"取消播放的语音内容:%@ --- %f",utterance.speechString,utterance.pitchMultiplier);
}
/// 这里 指的是 又来监听 播放 字符范围
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer willSpeakRangeOfSpeechString:(NSRange)characterRange utterance:(AVSpeechUtterance *)utterance {
    NSLog(@"指的是 又来监听 播放 字符范围 播放的语音内容:%@ --- %f --- %zd -- %zd",utterance.speechString,utterance.pitchMultiplier,characterRange.location,characterRange.length);
}
/*
 学习:
 1. AVSpeechSynthesizer
 
 功能
 
 将文字添加到语音, 就是用语音播放一段文字
 属性
 
 delegate : 代理, 主要是对语音播放状态的监听
 @protocol AVSpeechSynthesizerDelegate <NSObject>
 // 代理方法
 @optional
 // 开始播放 语音单元
 - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didStartSpeechUtterance:(AVSpeechUtterance *)utterance;
 // 完成播放 语音单元
 - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance;
 // 暂停播放 语音单元
 - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didPauseSpeechUtterance:(AVSpeechUtterance *)utterance;
 // 继续播放 语音单元
 - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didContinueSpeechUtterance:(AVSpeechUtterance *)utterance;
 // 取消播放 语音单元
 - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didCancelSpeechUtterance:(AVSpeechUtterance *)utterance;
 // 这里 指的是 又来监听 播放 字符范围
 - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer willSpeakRangeOfSpeechString:(NSRange)characterRange utterance:(AVSpeechUtterance *)utterance;
 @end
 speaking: 只读属性, 用来判断当前是否处于播放状态
 paused: 只读属性, 用来判断当前是否处于暂停状态
 
 方法
 
 // 添加 播放话语 到 播放语音 队列, 可以设置utterance的属性来控制播放
 - (void)speakUtterance:(AVSpeechUtterance *)utterance;
 
 // 对于 stopSpeakingAtBoundary: 语音单元的操作, 如果中断, 会清空队列
 // 中断
 - (BOOL)stopSpeakingAtBoundary:(AVSpeechBoundary)boundary;
 // 暂停
 - (BOOL)pauseSpeakingAtBoundary:(AVSpeechBoundary)boundary;
 // 继续
 - (BOOL)continueSpeaking;
 
 
 
 
 2. AVSpeechUtterance
 
 功能
 
 被播放的语音文字, 可以理解为一段需要播放的文字
 属性
 
 // 设置使用哪一个国家的语言播放
 @property(nonatomic, retain, nullable) AVSpeechSynthesisVoice *voice;
 // 获取当前需要播放的文字, 只读属性
 @property(nonatomic, readonly) NSString *speechString;
 // 获取当前需要播放的文字 - 富文本, 只读属性, iOS10以后可用
 @property(nonatomic, readonly) NSAttributedString *attributedSpeechString;
 // 本段文字播放时的 语速, 应介于AVSpeechUtteranceMinimumSpeechRate 和 AVSpeechUtteranceMaximumSpeechRate 之间
 @property(nonatomic) float rate;
 // 在播放特定语句时改变声音的声调, 一般取值介于0.5(底音调)~2.0(高音调)之间
 @property(nonatomic) float pitchMultiplier;
 // 声音大小, 0.0 ~ 1.0 之间
 @property(nonatomic) float volume;
 // 播放后的延迟, 就是本次文字播放完之后的停顿时间, 默认是0
 @property(nonatomic) NSTimeInterval preUtteranceDelay;
 // 播放前的延迟, 就是本次文字播放前停顿的时间, 然后播放本段文字, 默认是0
 @property(nonatomic) NSTimeInterval postUtteranceDelay;
 方法
 
 // 一下全部都是初始化方法, 分为 类方法 和 对象方法, 富文本的初始化方法要在iOS10以后才可以用
 
 + (instancetype)speechUtteranceWithString:(NSString *)string;
 + (instancetype)speechUtteranceWithAttributedString:(NSAttributedString *)string NS_AVAILABLE_IOS(10_0);
 - (instancetype)initWithString:(NSString *)string;
 - (instancetype)initWithAttributedString:(NSAttributedString *)string
 

 
 
 //可以得到所有语言:
 //[AVSpeechSynthesisVoice speechVoices];
 ar-SA  沙特阿拉伯（阿拉伯文）
 
 en-ZA, 南非（英文）
 
 nl-BE, 比利时（荷兰文）
 
 en-AU, 澳大利亚（英文）
 
 th-TH, 泰国（泰文）
 
 de-DE, 德国（德文）
 
 en-US, 美国（英文）
 
 pt-BR, 巴西（葡萄牙文）
 
 pl-PL, 波兰（波兰文）
 
 en-IE, 爱尔兰（英文）
 
 el-GR, 希腊（希腊文）
 
 id-ID, 印度尼西亚（印度尼西亚文）
 
 sv-SE, 瑞典（瑞典文）
 
 tr-TR, 土耳其（土耳其文）
 
 pt-PT, 葡萄牙（葡萄牙文）
 
 ja-JP, 日本（日文）
 
 ko-KR, 南朝鲜（朝鲜文）
 
 hu-HU, 匈牙利（匈牙利文）
 
 cs-CZ, 捷克共和国（捷克文）
 
 da-DK, 丹麦（丹麦文）
 
 es-MX, 墨西哥（西班牙文）
 
 fr-CA, 加拿大（法文）
 
 nl-NL, 荷兰（荷兰文）
 
 fi-FI, 芬兰（芬兰文）
 
 es-ES, 西班牙（西班牙文）
 
 it-IT, 意大利（意大利文）
 
 he-IL, 以色列（希伯莱文，阿拉伯文）
 
 no-NO, 挪威（挪威文）
 
 ro-RO, 罗马尼亚（罗马尼亚文）
 
 zh-HK, 香港（中文）
 
 zh-TW, 台湾（中文）
 
 sk-SK, 斯洛伐克（斯洛伐克文）
 
 zh-CN, 中国（中文）
 
 ru-RU, 俄罗斯（俄文）
 
 en-GB, 英国（英文）
 
 fr-FR, 法国（法文）
 
 hi-IN  印度（印度文）
 */
@end
